package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AttributeMapper;
import cn.tedu.csmall.product.mapper.AttributeTemplateMapper;
import cn.tedu.csmall.product.pojo.dto.AttributeAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AttributeUpdateInfoDTO;
import cn.tedu.csmall.product.pojo.entity.Attribute;
import cn.tedu.csmall.product.pojo.vo.AttributeListItemVO;
import cn.tedu.csmall.product.pojo.vo.AttributeStandardVO;
import cn.tedu.csmall.product.service.IAttributeService;
import cn.tedu.csmall.product.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class AttributeServiceImpl implements IAttributeService {

    @Autowired
    private AttributeMapper attributeMapper;
    @Autowired
    private AttributeTemplateMapper attributeTemplateMapper;

    @Override
    public void addNew(AttributeAddNewDTO attributeAddNewDTO) {
        log.debug("开始处理【添加属性】的业务，参数：{}",attributeAddNewDTO);
        //调用Mapper对象的countByNameAndTemplate方法查询属性名称和模板ID是否被占用
        String name = attributeAddNewDTO.getName();
        Long templateId = attributeAddNewDTO.getTemplateId();
        int countByName = attributeMapper.countByNameAndTemplate(name,templateId);
        log.debug("尝试在属性模板【{}】中添加属性【{}】，在数据库中此名称的属性数量为：{}", templateId, name, countByName);
        if (countByName > 0) {
            // 是：属性名称已经存在，抛出RuntimeException异常
            String message = "添加属性失败！此属性模板中已经存在名称为【" + name + "】的属性！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        //检查属性模板是否存在
        {
            Object queryResult = attributeTemplateMapper.getStandardById(templateId);
            if (queryResult == null) {
                String message = "添加属性失败！属性模板不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        //创建Attribute对象
        Attribute attribute = new Attribute();
        //补全Attribute对象中的属性值：来自参数attributeAddNewDTO
        BeanUtils.copyProperties(attributeAddNewDTO, attribute);
        //插入数据到数据库
        log.debug("即将插入数据到数据库，数据：{}",attribute);
        int rows = attributeMapper.insert(attribute);
        if (rows != 1) {
            String message = "添加属性失败！服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }
    }

    @Override
    public void updateInfoById(Long id, AttributeUpdateInfoDTO attributeUpdateInfoDTO) {
        log.debug("开始处理【根据id修改属性】的业务，参数id：{},新数据：{}",id,attributeUpdateInfoDTO);
        //调用Mapper的getStanardById()查询数据是否存在
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        if (queryResult == null) {
            //是：抛出异常
            String message = "修改属性详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        {
            //检查名称是否被占用
            Long templateId = queryResult.getTemplateId();
            int count = attributeMapper.countByNameAndTemplateAndNotId(id,attributeUpdateInfoDTO.getName(),templateId);
            if (count > 0) {
                String message = "修改数据详情失败，属性名称已经被占用！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
            }
        }

        //创建Attribute对象，将作为修改的参数
        Attribute attribute = new Attribute();
        //补全Attribute对象中的属性值：来自参数attributeAddNewDTO
        BeanUtils.copyProperties(attributeUpdateInfoDTO,attribute);
        attribute.setId(id);
        //调用Attribute的update()方法执行修改
        int rows = attributeMapper.update(attribute);
        if (rows != 1) {
            //是：抛出异常
            String message = "修改数据失败，服务器忙，请稍后在尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    @Override
    public void deleteById(Long id) {
        log.debug("开始处理【根据id删除数据】的业务，参数：{}",id);
        //调用Mapper的getStandardById()方法，查询数据是否存在
        AttributeStandardVO queryResult = attributeMapper.getStandardById(id);
        if (queryResult == null) {
            //是：抛出异常
            String message = "删除数据失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        log.debug("即将执行删除数据的操作，参数：{}",id);
        int rows = attributeMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除数据失败！服务器忙，请稍后在尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
    }

    @Override
    public AttributeStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询属性详情】的业务，参数：{}",id);
        //调用Mapper的getStandardById()方法
        AttributeStandardVO attributeStandardVO = attributeMapper.getStandardById(id);
        if (attributeStandardVO == null) {
            String message = "查询属性详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return attributeStandardVO;
    }

    @Override
    public List<AttributeListItemVO> listByTemplateId(Long templateId) {
        log.debug("开始处理【查询列表】的业务，参数无");

        return attributeMapper.listByTemplateId(templateId);
    }
}
